/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * FrmAtendimento.java
 *
 * Created on 24/06/2011, 14:16:59
 */
package com.pedagio.view;

import com.pedagio.dominio.Atendimento;
import com.pedagio.dominio.ComputadorBordo;
import com.pedagio.dominio.FalhaSistema;
import com.pedagio.dominio.Fatura;
import com.pedagio.dominio.SmartCard;
import com.pedagio.dominio.Usuario;
import com.pedagio.negocio.AtendimentoService;
import com.pedagio.negocio.DispositivoService;
import com.pedagio.negocio.FalhaSistemaService;
import com.pedagio.negocio.FaturaService;
import com.pedagio.negocio.UsuarioService;
import com.pedagio.util.Controle;
import com.pedagio.util.Simulador;
import java.awt.Color;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;

/**
 *
 * @author Bruno
 */
public class FrmAtendimento extends javax.swing.JDialog {
    private DispositivoService dispositivoService = Controle.getDispositivoService();
    private UsuarioService usuarioService = Controle.getUsuarioService();
    private FaturaService faturaService = Controle.getFaturaService();
    private AtendimentoService atendimentoService = Controle.getAtendimentoService();
    private FalhaSistemaService falhaService = Controle.getFalhaService();
    
    /** Creates new form FrmAtendimento */
    public FrmAtendimento (java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        lblAviso.setText("");
        listaDispositivo.setVisible(false);
        listaPlacas.setVisible(false);
    }

    public void mudarEstadoComboBox() {
        
        if(rdBtnFatura.isSelected()) {
            listaDispositivo.removeAllItems();
            popularListaUsuario(listaDispositivo);
            listaDispositivo.setVisible(true);
            listaPlacas.setVisible(false);
        }
        
        if(rdBtnSmartCard.isSelected()) {
            listaDispositivo.removeAllItems();
            listaPlacas.removeAllItems();
            popularListaSmartCard();
            popularListaUsuario(listaPlacas);
            listaDispositivo.setVisible(true);
            listaPlacas.setVisible(true);
        }
        
        if(rdBtnComputadorBordo.isSelected())  {
            listaDispositivo.removeAllItems();
            popularListaComputadorBordo();
            listaDispositivo.setVisible(true);
            listaPlacas.setVisible(false);
        }
    }
    
    /**
     * Preenche combobox com lista de SmartCards cadastrados
     */
    private void popularListaSmartCard() {
        List<SmartCard> dispositivos = dispositivoService.findAllSmartCard();
        for (SmartCard dispositivo : dispositivos) {
            listaDispositivo.addItem(dispositivo);
        }
    }
    
    /**
     * Preenche combobox com lista de ComputadorBordo cadastrados
     */
     private void popularListaComputadorBordo() {
        List<ComputadorBordo> dispositivos = dispositivoService.findAllComputadorBordo();
        for (ComputadorBordo dispositivo : dispositivos) {
            listaDispositivo.addItem(dispositivo);
        }
    }
    
    /**
     * Preenche combobox com lista de Veiculos cadastrados
     */
    private void popularListaUsuario(JComboBox listaPlacas) {
        List<Usuario> usuarios = usuarioService.findAllUsuario();
        for (Usuario veiculo : usuarios) {
            listaPlacas.addItem(veiculo);           
        }
    }
            
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        paymentMethod = new javax.swing.ButtonGroup();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        simulaPassagem = new javax.swing.JButton();
        lblAviso = new javax.swing.JLabel();
        rdBtnComputadorBordo = new javax.swing.JRadioButton();
        rdBtnSmartCard = new javax.swing.JRadioButton();
        rdBtnFatura = new javax.swing.JRadioButton();
        listaDispositivo = new javax.swing.JComboBox();
        listaPlacas = new javax.swing.JComboBox();

        jPanel1.setBackground(new java.awt.Color(242, 247, 247));

        jLabel1.setText("Forma de Pagamento:");

        simulaPassagem.setText("Simular passagem");
        simulaPassagem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                simulaPassagemActionPerformed(evt);
            }
        });

        lblAviso.setText("Avisos");

        paymentMethod.add(rdBtnComputadorBordo);
        rdBtnComputadorBordo.setText("Computador de Bordo");
        rdBtnComputadorBordo.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                rdBtnComputadorBordoMouseClicked(evt);
            }
        });
        rdBtnComputadorBordo.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                rdBtnComputadorBordoStateChanged(evt);
            }
        });
        rdBtnComputadorBordo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rdBtnComputadorBordoActionPerformed(evt);
            }
        });

        paymentMethod.add(rdBtnSmartCard);
        rdBtnSmartCard.setText("SmartCard");
        rdBtnSmartCard.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                rdBtnSmartCardMouseClicked(evt);
            }
        });
        rdBtnSmartCard.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                rdBtnSmartCardStateChanged(evt);
            }
        });
        rdBtnSmartCard.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rdBtnSmartCardActionPerformed(evt);
            }
        });

        paymentMethod.add(rdBtnFatura);
        rdBtnFatura.setText("Fatura");
        rdBtnFatura.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                rdBtnFaturaMouseClicked(evt);
            }
        });
        rdBtnFatura.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                rdBtnFaturaStateChanged(evt);
            }
        });

        listaDispositivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                listaDispositivoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(134, 134, 134)
                        .addComponent(simulaPassagem, javax.swing.GroupLayout.PREFERRED_SIZE, 329, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(lblAviso, javax.swing.GroupLayout.DEFAULT_SIZE, 656, Short.MAX_VALUE))
                .addContainerGap())
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addGap(31, 31, 31)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(rdBtnComputadorBordo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(rdBtnSmartCard, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(rdBtnFatura, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(90, 90, 90)
                .addComponent(listaDispositivo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 183, Short.MAX_VALUE)
                .addComponent(listaPlacas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(59, 59, 59))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lblAviso)
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(rdBtnComputadorBordo))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(rdBtnSmartCard)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(rdBtnFatura))
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(listaDispositivo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(listaPlacas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(70, 70, 70)
                .addComponent(simulaPassagem)
                .addGap(83, 83, 83))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 294, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void simulaPassagemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_simulaPassagemActionPerformed
        if(rdBtnComputadorBordo.isSelected()) {
            
            ComputadorBordo objeto = (ComputadorBordo) listaDispositivo.getSelectedItem();
            Atendimento atendimento = new Atendimento();
            atendimento.setData(new Date());
            atendimento.setFormaPagamento(objeto);
            atendimento.setUsuario(dispositivoService.getVeiculo(objeto));
            
            atendimentoService.persist(atendimento);
            
            lblAviso.setText("Registrado o atendimento pago por computador de bordo.");
            lblAviso.setForeground(Color.cyan);
            
            if(!Simulador.simulaLicenciamento()) {
                JOptionPane.showMessageDialog(null, "Atendimento registrado. Veículo não licenciado um aviso será enviado a polícia rodoviária local.");
                //simular envio a polícia
            } else {
                JOptionPane.showMessageDialog(null, "Atendimento registrado. O licenciamento do veículo está regular.");
            }
            
        } else if (rdBtnSmartCard.isSelected()) {
            SmartCard objeto = (SmartCard) listaDispositivo.getSelectedItem();
            
            Atendimento atendimento = new Atendimento();
            atendimento.setData(new Date());
            atendimento.setFormaPagamento(objeto);
            atendimento.setUsuario(null);
            
            
            lblAviso.setText("Registrado o atendimento pago por smart card");
            lblAviso.setForeground(Color.green);
            
            if(!Simulador.simulaLicenciamento()) {
                JOptionPane.showMessageDialog(null, "Atendimento registrado. Veículo não licenciado um aviso será enviado a polícia rodoviária local.");
                //simular envio a polícia
            } else {
                JOptionPane.showMessageDialog(null, "Atendimento registrado. O licenciamento do veículo está regular.");
            }
            
        } else if(rdBtnFatura.isSelected()) {
            Usuario objeto = (Usuario) listaDispositivo.getSelectedItem();
            
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MONTH, 1);
            Fatura fatura =  new Fatura();
            fatura.setEnderecoResponsavel(Simulador.simulaProprietario());
            fatura.setValor(6.30);
            fatura.setVencimento(calendar.getTime());
            faturaService.persist(fatura);
           
            
            Atendimento atendimento = new Atendimento();
            atendimento.setData(new Date());
            atendimento.setFormaPagamento(fatura);
            atendimento.setUsuario(objeto);
            atendimentoService.persist(atendimento);
            
            
            lblAviso.setText("Registrado o atendimento,  fatura enviada ao cliente");
            lblAviso.setForeground(Color.GREEN);
            
            if(!Simulador.simulaLicenciamento()) {
                FalhaSistema falha = new FalhaSistema();
                falha.setData(new Date());
                falha.setDescricao("");
                falha.setAtendimento(atendimento);
                falhaService.persist(falha);
                
                 JOptionPane.showMessageDialog(null, "Veículo não licenciado um aviso será enviado a polícia rodoviária local.");
                //simular envio a polícia
            } else {
                JOptionPane.showMessageDialog(null, "Atendimento registrado. O licenciamento do veículo está regular.");
            }
            
            
        } else {
            lblAviso.setText("Escolha uma forma de pagamento.");
            lblAviso.setForeground(Color.red);
        }
            
}//GEN-LAST:event_simulaPassagemActionPerformed

    private void rdBtnComputadorBordoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rdBtnComputadorBordoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_rdBtnComputadorBordoActionPerformed

    private void rdBtnSmartCardActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rdBtnSmartCardActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_rdBtnSmartCardActionPerformed

    private void listaDispositivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_listaDispositivoActionPerformed
    }//GEN-LAST:event_listaDispositivoActionPerformed

    private void rdBtnComputadorBordoStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_rdBtnComputadorBordoStateChanged


    }//GEN-LAST:event_rdBtnComputadorBordoStateChanged

    private void rdBtnSmartCardStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_rdBtnSmartCardStateChanged
        
    }//GEN-LAST:event_rdBtnSmartCardStateChanged

    private void rdBtnFaturaStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_rdBtnFaturaStateChanged
        
    }//GEN-LAST:event_rdBtnFaturaStateChanged

    private void rdBtnComputadorBordoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rdBtnComputadorBordoMouseClicked
       mudarEstadoComboBox();
    }//GEN-LAST:event_rdBtnComputadorBordoMouseClicked

    private void rdBtnSmartCardMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rdBtnSmartCardMouseClicked
        mudarEstadoComboBox();
    }//GEN-LAST:event_rdBtnSmartCardMouseClicked

    private void rdBtnFaturaMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rdBtnFaturaMouseClicked
        mudarEstadoComboBox();
    }//GEN-LAST:event_rdBtnFaturaMouseClicked

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
                FrmAtendimento dialog = new FrmAtendimento(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {

                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JLabel lblAviso;
    private javax.swing.JComboBox listaDispositivo;
    private javax.swing.JComboBox listaPlacas;
    private javax.swing.ButtonGroup paymentMethod;
    private javax.swing.JRadioButton rdBtnComputadorBordo;
    private javax.swing.JRadioButton rdBtnFatura;
    private javax.swing.JRadioButton rdBtnSmartCard;
    private javax.swing.JButton simulaPassagem;
    // End of variables declaration//GEN-END:variables
}
